//
// Created by Administrator on 2023/11/5.
//
/*
 * https://www.luogu.com.cn/problem/T215112
 * 信息学奥赛一本通 例题6.1 题目一样 通过
 * https://blog.csdn.net/qq_45949914/article/details/104242502
 * https://oj.ilingxin.cn/p/1228
 *排队打水问题--贪心

题目描述 有n个人排队到m个水龙头去打水，他们装满水桶的时间t1, t2 , ……, tn为整数且各不相同，应如何安排他们的打水顺序才能使他们花费的总时间最少? 只有一组输入数据哦。
输入格式

输入 4 2 （ n m ） 2 6 4 5 （t1 t2 …… tn）
输出格式

输出 23（所有人的花费时间总和）
输入输出样例
输入 #1
4 2
2 6 4 5
输出 #1
23
 输入 #2
 9 3
2 6 9 3 11 4 9 6 6
 输出 #2
92
 * 思路: 先按照打水时间从小到大排序,依次去龙头打水
 * 每人的等待时间+打水时间总和就是结果
 * */
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n =4, m=2, ret=0;
    // n: 人数 m: 水龙头数
    cin>>n>>m;
    // p[]保存每个人的打水时间 s[]保存每个水龙头前等待的时间
    int p[n],s[m+1]={0};
    for (int i = 0; i < n; ++i)
        cin>>p[i];
    // 升序排列 让接水最快的先接 减少所有人的空桶等待时间
    sort(p,p+n);
    // j: 代表不同的水龙头
    for (int i = 0, j = 0; i < n; ++i,++j)
    {
        // j%m 每个人轮换不同的水管, 将每个人在水管的耗时累加
        s[j%m]+=p[i];
        // 把每个水管总耗时数再次累加
        // 就包含了之前打水人的时间(也就是后边人的等待时间)了
        ret+=s[j%m];
    }
    cout<<ret;
    return 0;
}